from PIL import Image, ImageDraw, ImageFont
import os
from config import Config

# def getCard(imgBackground_path, imgQrcode_path, context):
#     SAVE_PATH = Config.PATH_IMAGE_CARD
#     POST_CARD_PATH = Config.PATH_POST_CARD
    
#     # 打开背景图片
#     background = Image.open(imgBackground_path).convert("RGBA")
    
#     # 打开二维码图片
#     qrcode = Image.open(imgQrcode_path).convert("RGBA")
    
#     # 设置二维码大小（可以根据背景图比例调整）
#     qrcode_size = (int(background.width * 0.2), int(background.height * 0.2))  # 二维码为背景图宽度的20%
#     qrcode = qrcode.resize(qrcode_size, 1)  # 使用 Resampling.LANCZOS 而不是 ANTIALIAS
    
#     # 二维码放置在右上角
#     position_qrcode = (background.width - qrcode.width, 0)
#     background.paste(qrcode, position_qrcode, mask=qrcode)
    
#     # 创建一个绘图对象
#     draw = ImageDraw.Draw(background)
    
#     # 设置字体（这里使用系统默认字体，你也可以指定字体路径）
#     try:
#         font = ImageFont.truetype("simhei.ttf", 40)  # 支持中文
#     except:
#         font = ImageFont.load_default()
    
#     # 获取文本尺寸
#     text_bbox = draw.textbbox((0, 0), context, font=font)
#     text_width = text_bbox[2] - text_bbox[0]
#     text_height = text_bbox[3] - text_bbox[1]
    
#     # 文本放置在图片顶部中央
#     text_position = ((background.width - text_width) // 2, 20)  # 距离顶部20像素
    
#     # 添加文本到图片上（白色字体，可调整颜色）
#     draw.text(text_position, context, fill=(255, 255, 255), font=font)
    
#     # 保存合成后的图片，输出路径为原背景图名加 _card 后缀
#     base, ext = os.path.splitext(imgBackground_path)
    
#     # 转换为RGB保存为常见格式（如jpg）
#     background = background.convert("RGB")
#     background.save(SAVE_PATH, format=background.format)
from PIL import Image, ImageDraw, ImageFont

def getCard(imgBackground_path, imgQrcode_path, context):
    SAVE_PATH = Config.PATH_IMAGE_CARD
    POST_CARD_PATH = Config.PATH_POST_CARD
    
    # 打开并调整背景图片大小到明信片尺寸
    background = Image.open(POST_CARD_PATH).convert("RGBA").resize((1000, 666), Image.Resampling.LANCZOS)
    
    # 打开人物照片并调整大小（宽度不超过400像素）
    person_photo = Image.open(imgBackground_path).convert("RGBA")
    person_ratio = min(400 / person_photo.width, (666 - 210) / person_photo.height)
    new_size = (int(person_photo.width * person_ratio), int(person_photo.height * person_ratio))
    person_photo = person_photo.resize(new_size, Image.Resampling.LANCZOS)
    
    # 打开二维码图片并调整大小至100x100像素
    qrcode = Image.open(imgQrcode_path).convert("RGBA").resize((110, 110), Image.Resampling.LANCZOS)
    
    # 将人物照片和二维码粘贴到背景上的指定位置
    background.paste(person_photo, (21, 210), mask=person_photo)
    background.paste(qrcode, (825, 69), mask=qrcode)
    
    # 创建一个绘图对象并添加文字
    draw = ImageDraw.Draw(background)
    try:
        font = ImageFont.truetype("simhei.ttf", 30)  # 调整字体大小以适应文本区域宽度
    except:
        font = ImageFont.load_default()
    
    # 文本放置在指定位置，宽度限制在465像素左右
    text_position = (460, 300)
    draw_text_with_wrap(draw, context, text_position, font, 520)
    
    # 转换为RGB模式保存
    background.convert("RGB").save(SAVE_PATH, format='JPEG')

# 注意: 在实际使用前请确保正确设置了Config.PATH_IMAGE_CARD和Config.PATH_POST_CARD
def draw_text_with_wrap(draw, text, position, font, max_width):
    """
    根据最大宽度对文本进行换行处理并绘制在图片上，支持中文。
    
    :param draw: ImageDraw对象
    :param text: 要绘制的文本内容
    :param position: 文本起始位置 (x, y)
    :param font: 使用的字体
    :param max_width: 文本区域的最大宽度
    """
    x, y = position
    current_line = ""
    line_height = font.getmetrics()[0] + font.getmetrics()[1]  # 行高
    
    for char in text:
        # 尝试添加当前字符到当前行
        test_line = current_line + char
        # 计算测试行的宽度
        bbox = draw.textbbox((0, 0), test_line, font=font)
        test_width = bbox[2] - bbox[0]
        
        # 如果超过最大宽度，则换行
        if test_width > max_width:
            # 绘制当前行
            draw.text((x, y), current_line, fill=(0,0,0), font=font)
            # 重置当前行为新字符
            current_line = char
            # 下移一行
            y += line_height
        else:
            current_line = test_line
    
    # 绘制最后一行
    if current_line:
        draw.text((x, y), current_line, fill=(0,0,0), font=font)